//package app.jnsw.com.database.db;
//
//import com.google.common.base.Strings;
//import com.j256.ormlite.android.apptools.OpenHelperManager;
//import com.j256.ormlite.dao.Dao;
//import com.j256.ormlite.dao.GenericRawResults;
//import com.j256.ormlite.field.DatabaseField;
//import com.j256.ormlite.table.DatabaseTable;
//import com.jnsw.core.anotation.LocalField;
//import com.jnsw.core.anotation.RemoteTable;
//import com.jnsw.core.sync.SyncPolicy;
//
//import org.json.JSONException;
//
//import java.lang.reflect.Field;
//import java.sql.SQLException;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//
//
//
//import app.jnsw.com.database.db.BuildConfig;
//import app.jnsw.com.database.db.data.DataTables;
//import app.jnsw.com.database.db.exception.DataBaseTableClazzHasNoFields;
//import app.jnsw.com.database.db.exception.NotDatabaseTableClazzException;
//
//
///**
// * Created by foxundermoon on 2015/7/29.
// * 数据传输（上传 下载类） 提供数据传输的方法
// */
//public class DataSyncHelper {
//    static boolean debug = BuildConfig.XJ_DB_DEBYG;
//    static DataSyncHelper instance;
//    public DatabaseHelper DatabaseHelper;
//    public String lastError;
//
//    public static DataSyncHelper getInstance() {
//        if (instance == null) {
//            instance = new DataSyncHelper();
//        }
//        return instance;
//    }
//
//    private void debug(String message) {
//        if (debug) {
//            Tip.longTip(message);
//        }
//    }
//
//    private DataSyncHelper() {
//        DatabaseHelper = OpenHelperManager.getHelper(CustomApplication.getInstance(), DatabaseHelper.class);
//    }
//
//    public DataSyncHelper downloadSync(Class<?> dataTableClazz) {
//        syncFromServer(dataTableClazz);
//        return this;
//    }
//
//
//    public void release() {
//        DatabaseHelper = null;
//        instance = null;
//        lastError = null;
//    }
//
//    public DataSyncHelper downloadSyncAll() {
//        for (Class<?> clazz : DataTables.getTableClazzs()) {
//            syncFromServer(clazz);
//        }
//        return this;
//
//    }
//
//    public DataSyncHelper uploadSync(Class<?> dataTableClazz) {
//        try {
//            syncToServer(dataTableClazz);
//        } catch (NotDatabaseTableClazzException e) {
//            e.printStackTrace();
//            debug(e.getMessage());
//
//        } catch (SQLException e) {
//            debug(e.getMessage());
//
//        } catch (DataBaseTableClazzHasNoFields dataBaseTableClazzHasNoFields) {
//            dataBaseTableClazzHasNoFields.printStackTrace();
//            debug(dataBaseTableClazzHasNoFields.getMessage());
//
//        } catch (JSONException e) {
//            e.printStackTrace();
//            debug(e.getMessage());
//
//        }
//        return this;
//    }
//
//    public DataSyncHelper uploadSyncAll() {
//        for (Class<?> clazz : DataTables.getTableClazzs()) {
//            uploadSync(clazz);
//        }
//        return this;
//    }
//
//    void syncFromServer(Class<?> dataTableClazz) {
//        try {
//            syncFromServer(dataTableClazz, null);
//        } catch (NotDatabaseTableClazzException e) {
//            e.printStackTrace();
//            debug(e.getMessage());
//        } catch (SQLException e) {
//            e.printStackTrace();
//            debug(e.getMessage());
//        }
//    }
//
//    void syncFromServer(Class<?> dataTableClazz, String conditions) throws NotDatabaseTableClazzException, SQLException {
//        DatabaseTable tbanno = dataTableClazz.getAnnotation(DatabaseTable.class);
//        RemoteTable remoteTable = dataTableClazz.getAnnotation(RemoteTable.class);
//        if (remoteTable == null || remoteTable.syncPolicy() == SyncPolicy.Upload)
//            return;
//        boolean hasVersion = false;
//        try {
//            Field version = dataTableClazz.getDeclaredField("版本");
//            if (version != null) {
//                hasVersion = true;
//            }
//        } catch (NoSuchFieldException e) {
////            e.printStackTrace();
//        }
//        if (tbanno == null || remoteTable == null) {
//            throw new NotDatabaseTableClazzException();
//        }
//        try {
//            Dao<?, ?> dao = OpenHelperManager.getHelper(CustomApplication.getInstance(), DatabaseHelper.class).getDao(dataTableClazz);
//            syncFromServer(dao, remoteTable.tableName(), tbanno.tableName(), conditions, hasVersion);
//        } catch (SQLException e) {
//            e.printStackTrace();
//
//            throw e;
//        }
//    }
//
//    void syncFromServer(final Dao<?, ?> dao, String serverTableName, final String localTbName, String conditions, boolean hasVersion) {
//        int biggestID = 0;
//        try {
//            //获取本地最大ID  ID大于最大ID就是新添加的数据  相同ID版本号大的也是新数据
//            GenericRawResults<String[]> rawResults = dao.queryRaw("select ID from " + localTbName + " order by ID DESC limit 0,10;");
//            if (rawResults != null) {
//                String[] firstRow = rawResults.getFirstResult();
//                if (firstRow != null) {
//                    biggestID = Integer.parseInt(firstRow[0]);
//                }
//            }
//            socketMessage query = new socketMessage();
//            Class<?> tbClazz = dao.getDataClass();
//            final Field[] fields = tbClazz.getDeclaredFields();
//            StringBuilder stringBuilder = new StringBuilder("SELECT ");
//            for (Field field : fields) {
//                if (field.getAnnotation(LocalField.class) == null) {
//                    stringBuilder.append(field.getName()).append(" ,");
//                }
//            }
//            stringBuilder.deleteCharAt(stringBuilder.length() - 1);
//            stringBuilder.append(" FROM ").append(serverTableName);
//            String querySql = stringBuilder.toString() + "  WHERE ID >" + biggestID;
//            if (!Strings.isNullOrEmpty(conditions)) {
//                querySql += " ";
//                querySql += conditions;
//            }
//            query.creatCommand().setName(socketCommand.DataTable).setOperation(Operation.query)
//                    .setSql(querySql);
//            query.setCallback(new Callback<socketMessage>() {
//                @Override
//                public void onCallback(socketMessage message) {
//                    if (message.hasError) {
//                        Tip.longTip(message.errorMessage);
//                    } else if (message.getDataTable() != null && message.getDataTable().getColumns().size() > 0) {
//                        for (Row r : message.getDataTable().getRows()) {
//                            StringBuilder sb = new StringBuilder();
//                            sb.append("INSERT INTO ").append(localTbName)
//                                    .append("(");
//                            StringBuilder sb2 = new StringBuilder();
//                            try {
//
//                                for (Map.Entry<String, Object> pair : r.getData().entrySet()) {
//                                    if (!"LID".equalsIgnoreCase(pair.getKey())) {
//                                        sb.append(pair.getKey()).append(",");
//                                        Object v = pair.getValue();
//                                        String append = "";
//                                        if (v == null || v.toString().equalsIgnoreCase("null")) {
//
//                                        } else {
//                                            append = v.toString();
//                                        }
//                                        sb2.append("'").append(append).append("',");
//                                    }
//                                }
//                            } catch (Exception e) {
//                                L.e(DataSyncHelper.class, e.getMessage());
//                            }
//
////                            sb.deleteCharAt(sb.length() - 1);
//                            sb.append("数据状态");
////                            sb2.deleteCharAt(sb2.length() - 1);
//                            sb2.append("'").append(DataStatus.Synced.toString()).append("'");
//                            sb.append(")").append(" VALUES (").append(sb2).append(")");
//                            try {
//                                int effectrow = dao.executeRawNoArgs(sb.toString());
//                            } catch (SQLException e) {
//                                e.printStackTrace();
//                                L.e(DataSyncHelper.class, e.getMessage());
//                                lastError = e.getMessage();
//                                Tip.shortTip(e.getMessage());
////                                return false;
//                            }
//                        }
//
//                    }
//                }
//            });
//            try {
//                query.send();
//            } catch (JSONException e) {
//                e.printStackTrace();
//            }
//            //本地数据库有数据的情况
//            if (biggestID > 0 && hasVersion) {
//                GenericRawResults<String[]> localRawResults = dao.queryRaw("select ID ,版本 from " + localTbName + ";");
//                if (localRawResults != null) {
//                    List<String[]> result = localRawResults.getResults();
//                    if (result != null) {
//                        socketMessage update = new socketMessage();
//                        String condition = "ID=@ID and 版本>@版本";
//                        if (!Strings.isNullOrEmpty(conditions)) {
//                            condition += " and ";
//                            condition += conditions;
//                        }
//                        update.creatCommand().setName(socketCommand.DataTable)
//                                .setOperation(Operation.mutiQuery)
//                                .setCondition(condition)
//                                .setSql(stringBuilder.toString() + " WHERE " + condition);
//                        Table tb = update.createTable(new Column("ID", "int"), new Column("版本", "int"))
//                                .setName(serverTableName);
//                        for (String[] r : result) {
//                            try {
//                                tb.createRow().put("ID", r[0]).put("版本", r[1]);
//                            } catch (Exception e) {
//                                e.printStackTrace();
//                                L.e(DataSyncHelper.class, e.getMessage());
//                                lastError = e.getMessage();
//                                Tip.shortTip(e.getMessage());
//                            }
//                        }
//                        update.setCallback(new Callback<socketMessage>() {
//                            @Override
//                            public void onCallback(socketMessage message) {
//                                if (message.hasError) {
//                                    Tip.longTip(message.errorMessage);
//                                } else if (message.getDataTable().getColumns().size() > 0) {
//                                    for (Row r : message.getDataTable().getRows()) {
//                                        StringBuilder sb = new StringBuilder();
//                                        sb.append("UPDATE ").append(localTbName)
//                                                .append(" SET ");
//
//                                        String id = "";
//                                        for (Map.Entry<String, Object> pair : r.getData().entrySet()) {
//                                            if (pair.getKey().equalsIgnoreCase("ID")) {
//                                                id = pair.getValue().toString();
//                                            }
//                                            sb.append(pair.getKey()).append("='").append(pair.getValue().toString()).append("' ,");
//                                        }
////                                        sb.deleteCharAt(sb.length() - 1);
//                                        sb.append("数据状态='").append(DataStatus.Synced).append("'");
//                                        sb.append(" WHERE ID='").append(id).append("';");
//                                        try {
//                                            int effectrow = dao.executeRawNoArgs(sb.toString());
//                                        } catch (SQLException e) {
//                                            e.printStackTrace();
//                                            lastError = e.getMessage();
//                                            Tip.shortTip(e.getMessage());
////                                return false;
//                                        }
//                                    }
//
//                                }
//
//                            }
//                        });
//                        try {
//                            update.send();
//                        } catch (JSONException e) {
//                            e.printStackTrace();
//                            lastError = e.getMessage();
//
//                        }
//                    }
//                }
//            }
//
//        } catch (SQLException e) {
//            e.printStackTrace();
//        }
//    }
//
//
//    void syncToServer(Class<?> dataTableClazz) throws NotDatabaseTableClazzException, SQLException, DataBaseTableClazzHasNoFields, JSONException {
//        final DatabaseTable tbanno = dataTableClazz.getAnnotation(DatabaseTable.class);
//        RemoteTable remoteTable = dataTableClazz.getAnnotation(RemoteTable.class);
//        if (remoteTable == null || remoteTable.syncPolicy() == SyncPolicy.Download)
//            return;
//        if (tbanno == null || remoteTable == null) {
//            throw new NotDatabaseTableClazzException();
//        }
//        final Dao<?, ?> dao = OpenHelperManager.getHelper(CustomApplication.getInstance(), DatabaseHelper.class).getDao(dataTableClazz);
//        Field[] fields = dataTableClazz.getDeclaredFields();
//        if (fields == null || fields.length < 1) {
//            throw new DataBaseTableClazzHasNoFields();
//        }
//        StringBuilder updateSql = new StringBuilder();
//        updateSql.append("update ").append(remoteTable.tableName())
//                .append(" set ");
//        socketMessage message = new socketMessage();
//        message.creatCommand().setName(socketCommand.DataTable)
//                .setOperation(Operation.insert);
//        StringBuilder sb = new StringBuilder("SELECT ");
//        List<Column> columns = new ArrayList<>();
//        for (Field field : fields) {
//            boolean need = false;
//            if (field.getAnnotation(DatabaseField.class) != null) {
//                if (field.getAnnotation(LocalField.class) != null) {
//                    if (field.getAnnotation(DatabaseField.class).generatedId()) {
//                        need = true;
//                    }
//                } else {
//                    need = true;
//                }
//            }
//            if (need) {
//                //insert
////                if (!"ID".equalsIgnoreCase(field.getName())) {
//                sb.append(" ").append(field.getName()).append(" ,");
//                columns.add(new Column(field.getName()));
////                }
//
//                //update
//                if (!"LID".equals(field.getName())){
//
//                    updateSql.append(" ").append(field.getName()).append("=@").append(field.getName()).append(",");
//                }
//            }
//        }
//        updateSql.deleteCharAt(updateSql.length() - 1)
//                .append(" where ID=@ID");
//        Table tb = message.createTable(columns);
//        tb.setName(remoteTable.tableName());
//        sb.deleteCharAt(sb.length() - 1);
//        sb.append(" FROM ").append(tbanno.tableName());
//        try {
////        sb.append(" WHERE ID ='0' ;");
//            GenericRawResults<String[]> rawResults = dao
//                    .queryRaw(String.format("%s WHERE 数据状态='%s' or ID='0'", sb.toString(), DataStatus.Inserted.toString()));//where ID IS NULL or ID='0';");
//            if (rawResults != null) {
//                boolean hasData = false;
//                String[] localColumns = rawResults.getColumnNames();
//                for (String[] r : rawResults) {
//                    Row msgR = tb.createRow();
//                    hasData = true;
//                    int i = 0;
//                    for (String v : r) {
//                        try {
//                            msgR.put(localColumns[i++], v);
//                        } catch (Exception e) {
//                            e.printStackTrace();
//                            debug(e.getMessage());
//                        }
//                    }
//                }
//                message.setCallback(new Callback<socketMessage>() {
//                    @Override
//                    public void onCallback(socketMessage message) {
//                        if (message.hasError) {
//                            lastError = message.errorMessage;
//                            debug(message.errorMessage);
//                        } else if (message.getDataTable() != null && message.getDataTable().getRows().size() > 0) {
//                            for (Row r : message.getDataTable().getRows()) {
//                                try {
//                                    String sql = String.format("update %s set ID='%s' , 数据状态='%s' where LID='%s' ;", tbanno.tableName(), r.get("ID"), DataStatus.Synced.toString(), r.get("LID"));
//                                    dao.executeRaw(sql);
//                                } catch (SQLException e) {
//                                    debug(e.getMessage());
//                                    e.printStackTrace();
//                                }
//                            }
//                        }
//                    }
//                });
//                if (hasData) {
//                    message.send();
//                }
//            }
//        } catch (SQLException e) {
//            debug(e.getMessage());
//        } catch (Exception e) {
//            debug(e.getMessage());
//        }
//        // update fixed
//        final socketMessage upload = new socketMessage();
//
//        upload.creatCommand().setName(socketCommand.DataTable)
//                .setOperation(Operation.update)
//                .setCondition("ID=@ID");
////                .setSql(updateSql.toString());
//
//        Table tbupdate = upload.createTable(columns);//创建数据表
//        tbupdate.setName(remoteTable.tableName());//设置表名
//
//        GenericRawResults<String[]> updateResults = dao.queryRaw(sb.toString() + " WHERE ID IS NOT NULL  AND 数据状态='" + DataStatus.Updated.toString() + "'");
//
//        if (updateResults != null) {
//            boolean hasData = false;
//            String[] localColumns = updateResults.getColumnNames();
//            for (String[] row : updateResults) {
//                hasData = true;
//                Row r = tbupdate.createRow();
//                int i = 0;
//                for (String v : row) {
//                    try {
//                        r.put(localColumns[i++], v);
//                    } catch (Exception e) {
//                        e.printStackTrace();
//                        debug(e.getMessage());
//                    }
//                }
//            }
//            upload.setCallback(new Callback<socketMessage>() {
//                @Override
//                public void onCallback(socketMessage message) {
////                    Log.d("upload callback ","ture"+message.getProperty("Count"));
//                    if (message.hasError) {
//                        lastError = message.errorMessage;
//                    }
//                    //若返回且无错误信息 则更新本地数据库
//                    else {
//                        int count = Integer.valueOf(message
//                                .getProperty("Count").toString());
//                        if (count > 0) {
//                            for (Row r :   upload.getDataTable().getRows()) {
//                                try {
//                                    String sql = String.format("update %s set  数据状态='%s'  where LID='%s' ;", tbanno.tableName(), DataStatus.Synced.toString(), r.get("LID"));
//
//                                    dao.executeRaw(sql);
//                                } catch (SQLException e) {
//                                    e.printStackTrace();
//                                    debug(e.getMessage());
//                                }
//                            }
//                        }
//                    }
//                }
//            });
//            if (hasData) {
//                upload.send();
//            }
//        }
//    }
//
//}